import axios from 'axios'
import {ElLoading, ElMessage} from 'element-plus'
import {saveAs} from 'file-saver'
import {getToken} from '@/utils/auth'
import errorCode from '@/utils/errorCode'
import {blobValidate} from "@/utils/zpPlatform";

//@ts-ignore
const baseURL = import.meta.env.VITE_APP_TARGET_URL
let downloadLoadingInstance;

export default {
  oss(ossId) {
    let url = baseURL + '/resource/oss/download/' + ossId
    downloadLoadingInstance = ElLoading.service({
      text: "正在下载数据，请稍候",
      spinner: "el-icon-loading",
      background: "rgba(0, 0, 0, 0.7)",
    })
    axios({
      method: 'get',
      url: url,
      responseType: 'blob',
      headers: {'Authorization': 'Bearer ' + getToken()}
    }).then(async (res) => {
      const isLogin = await blobValidate(res.data);
      if (isLogin) {
        const blob = new Blob([res.data], {type: 'application/octet-stream'})
        saveAs(blob, decodeURI(res.headers['download-filename']))
      } else {
        await printErrMsg(res.data);
      }
      downloadLoadingInstance.close();
    }).catch((r) => {
      console.error(r)
      ElMessage.error('下载文件出现错误，请联系管理员！')
      downloadLoadingInstance.close();
    })
  },
  saveAs(text, name, opts) {
    saveAs(text, name, opts);
  },

}

function download(url, params, filename) {
  const link = document.createElement('a')
  let url_s = baseURL + url
  downloadLoadingInstance = ElLoading.service({
    text: "正在下载数据，请稍候",
    spinner: "el-icon-loading",
    background: "rgba(0, 0, 0, 0.7)",
  })
  axios({
    method: 'post',
    url: url_s,
    responseType: 'blob',
    headers: {'Authorization': 'Bearer ' + getToken(), 'Content-Type': 'application/x-www-form-urlencoded'},
    data: params
  }).then(async (res) => {
    const isBlob = await blobValidate(res.data);
    if (isBlob) {
      const blob = new Blob([res.data], {type: 'application/octet-stream'})
      link.download = filename

      let objectUrl = URL.createObjectURL(blob)
      link.href = objectUrl
      document.body.appendChild(link)
      // 下载文件
      link.click()
      // 释放内存
      window.URL.revokeObjectURL(objectUrl)
      document.body.removeChild(link)
    }
    downloadLoadingInstance.close();
  }).catch((r) => {
    console.error(r)
    ElMessage.error('下载文件出现错误，请联系管理员！')
    downloadLoadingInstance.close();
  })

}

function zip(url, name) {
  let url_s = baseURL + url
  axios({
    method: 'get',
    url: url_s,
    responseType: 'blob',
    headers: {'Authorization': 'Bearer ' + getToken()}
  }).then(async (res) => {
    const isLogin = await blobValidate(res.data);
    if (isLogin) {
      const blob = new Blob([res.data], {type: 'application/zip'})
      saveAs(blob, name)
    } else {
      printErrMsg(res.data);
    }
  })
}

async function printErrMsg(data) {
  const resText = await data.text();
  const rspObj = JSON.parse(resText);
  const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
  ElMessage.error(errMsg);
}

export {
  download,
  zip
}

